#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sstream>
#include <iostream>
#include "classes.cpp"

using namespace std;

void mostraLogo(SDL_Surface *screen);
void atualizaUnidades();
void desenhaTela(SDL_Surface *screen);
void carregaRecursos();
void liberaRecursos();
void preencheCaminho();
int funcaoReta(int x, int sinal);
void desenhaReta(SDL_Surface *screen,vector<Casa> &guiaInimigo, int x, int y, int xl, int yl);
void atualizaInimigos(vector<Inimigo> &inimigos);
void atualizaTorres(vector<Torre> &torres);
void desenhaTorres(SDL_Surface *screen);
void desenhaInimigos(SDL_Surface *screen);
void desenhaOutros(SDL_Surface *screen);
void desenhaMalha(SDL_Surface *screen);
void desenhaTexto(SDL_Surface *screen, const char *text, TTF_Font *font, int x, int y);
void desenhaTextoSombra(SDL_Surface *screen, const char *text, TTF_Font *font, int x, int y);
void desenhaVidaInimigos(SDL_Surface *screen);
void telaInicial(SDL_Surface *screen);
void telaAbout(SDL_Surface *screen);
void organizaUnidades ();
void preencheUnidades();
void limpaTela(SDL_Surface *screen);
void desenhaCompra(SDL_Surface *screen);

bool quit = false, pausado = false, habilitaTorre = false, fim_de_jogo = false;
int mostraMalha = 1, alfaMalha, sinalMalha = 2, selecTorre = 0, sair = 1;
Malha m;
SDL_Rect rect;
Jogador jogador;
Unidade mapa, fundo, lapis, malha,  menu, selecao, tinta, inimigo, borracha, drawing;
Inimigo inimigoEsquerda,inimigoDireita, castelo;
Unidade inimigoDireita1, inimigoDireita2, inimigoDireita3, inimigoEsquerda1, inimigoEsquerda2, inimigoEsquerda3;
Torre torreEsquerda, torreDireita, torre_l, arqueiro, torreEsquerdaAttack, torreDireitaAttack, torreAttackTemp;
Recurso recurso;
Wave wave;
vector<Inimigo> inimigos; 
vector<Torre> torres;
vector<Unidade> unidades;
vector<Recurso> recursos;
vector <unsigned int> passo;
TTF_Font *font_pause = NULL, *font_fim_jogo = NULL, *font_vida_castelo = NULL, *font_custo = NULL;

int main()
{
  SDL_Surface *screen = NULL;
  int width = 1024, height = 720;
  int bpp = 16;
  Uint32 video_options = SDL_HWSURFACE | SDL_DOUBLEBUF;
  int rc = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO);
  vector <Unidade> unidades;
  
  if (rc == -1)
  {
    fprintf(stderr, "Erro na inicializacao da SDL: %s\n",
	    SDL_GetError());
    return -1;
  }
  
  atexit(SDL_Quit);
  
  rc = TTF_Init();
  
  if (rc != 0) {
    fprintf(stderr, "Erro na inicializacao da SDL_ttf: %s\n", 
	    TTF_GetError());
    return -2;
  }
  
  SDL_WM_SetCaption("DrawingAttack", "DrawingAttack");
  SDL_WM_SetIcon(SDL_LoadBMP("/usr/Drawing/resources/DrawingAttack32.bmp"), 
		 NULL);
  
  screen = SDL_SetVideoMode(width, height, bpp, video_options);
  
  if (!screen)
  {
    fprintf(stderr, "Nao foi possivel inicializar o video"
    "com as configuracoes indicadas: %s\n", SDL_GetError());
    return -2;
  }
  carregaRecursos();
  mostraLogo(screen);
  
  while(!quit && sair != 0){
    if(sair == 1){
      telaInicial(screen);
    }
    if(sair == 2){
      telaAbout(screen);
    }
  }
  while (!quit) {
    limpaTela(screen);
    atualizaUnidades();
    desenhaTela(screen);
  }
  liberaRecursos();
  return 0;
}

void mostraLogo(SDL_Surface *screen){
  int i;
  SDL_Surface *img, *logo;
  img = SDL_LoadBMP("/usr/Drawing/resources/Logo_1024x720.bmp");
  logo =  SDL_DisplayFormatAlpha(img);
  Audio audio;
  audio.rodar("/usr/Drawing/resources/logo.wav");
  for(i = 0; i <= 256; i = i+8){
    if (i == 256)
      i = 255;
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
    SDL_SetAlpha(img, SDL_SRCALPHA|SDL_RLEACCEL, i);
    logo =  SDL_DisplayFormatAlpha(img);
    SDL_BlitSurface(logo,NULL, screen, NULL);
    SDL_Flip(screen);
  }
  SDL_Delay(3500);
  while (i >= -1){
    if (i >= 256)
      i = 255;
    if (i == -1)
      i = 0;
    SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
    SDL_SetAlpha(img, SDL_SRCALPHA|SDL_RLEACCEL, i);
    logo =  SDL_DisplayFormatAlpha(img);
    SDL_BlitSurface(logo,NULL, screen, NULL);
    SDL_Flip(screen);
    i = i-8;
  }
  SDL_FreeSurface(img);
  SDL_FreeSurface(logo);
  audio.~Audio();
}

void telaInicial(SDL_Surface *screen){
  
  SDL_Event event;
  SDL_Surface *img, *logo;
  SDL_Rect casa1;
  SDL_Color branco;
  branco.r = branco.g = branco.b = 255;
  SDL_PixelFormat *format = screen->format;
  Uint32 pixelBranco = SDL_MapRGB(format, branco.r, branco.g, branco.b);
  
  SDL_FillRect(screen, NULL, pixelBranco);
  
  img = SDL_LoadBMP("/usr/Drawing/resources/fundo.bmp");
  logo =  SDL_DisplayFormatAlpha(img);
  SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
  SDL_BlitSurface(logo,NULL, screen, NULL);
  
  img = SDL_LoadBMP("/usr/Drawing/resources/castelo.bmp");
  casa1.x = 450;
  casa1.y = 500;
  SDL_SetColorKey(img, SDL_SRCCOLORKEY, SDL_MapRGB(img->format, 255, 255, 255));
  SDL_BlitSurface(img,NULL, screen, &casa1);
  
  img = SDL_LoadBMP("/usr/Drawing/resources/torre_esquerda.bmp");
  casa1.x = 300;
  casa1.y = 500;
  SDL_SetColorKey(img, SDL_SRCCOLORKEY, SDL_MapRGB(img->format, 255, 255, 255));
  SDL_BlitSurface(img,NULL, screen, &casa1);
  
  img = SDL_LoadBMP("/usr/Drawing/resources/torre_direita.bmp");
  casa1.x = 550;
  casa1.y = 500;
  SDL_SetColorKey(img, SDL_SRCCOLORKEY, SDL_MapRGB(img->format, 255, 255, 255));
  SDL_BlitSurface(img,NULL, screen, &casa1);
  
  desenhaTexto(screen, "Jogar", font_pause, 430, 270);
  desenhaTexto(screen, "Sobre", font_pause, 430, 420);
  casa1.x = 200;
  casa1.y = 10;
  SDL_BlitSurface(drawing.img,NULL, screen, &casa1);
  SDL_Flip(screen);
  SDL_FreeSurface(logo);
  SDL_FreeSurface(img);
  while (SDL_PollEvent(&event)) {
    switch (event.type) {
      case SDL_QUIT:
	quit = true;
	break;
      case SDL_KEYDOWN:
	switch (event.key.keysym.sym) {
	  case SDLK_ESCAPE:
	    quit = true;
	    break;
	  default:
	    break;
	}break;
	  case SDL_MOUSEMOTION:
	    if (((event.button.x > 430)&&(event.button.x<560))&&
	      ((event.button.y>270)&&(event.button.y<320))){
	      desenhaTextoSombra(screen, "Jogar", font_pause, 430, 270);
	    SDL_Flip(screen);
	      }
	      if (((event.button.x > 430)&&(event.button.x<560))&&
		((event.button.y>420)&&(event.button.y<470))){
		desenhaTextoSombra(screen, "Sobre", font_pause, 430, 420);
	      SDL_Flip(screen);
		}
		break;
	  case SDL_MOUSEBUTTONUP:
	    switch (event.button.button) {
	      case SDL_BUTTON_LEFT:
		if (((event.button.x > 430)&&(event.button.x<560))&&
		  ((event.button.y>270)&&(event.button.y<320))){
		  sair = 0;
		  }
		  if (((event.button.x > 430)&&(event.button.x<560))&&
		    ((event.button.y>420)&&(event.button.y<470))){
		    sair = 2;
		    }
		    break;  
	    }
    }
  }
}

void telaAbout(SDL_Surface *screen){
  SDL_Event event;
  SDL_Surface *img;
  SDL_Color branco;
  branco.r = branco.g = branco.b = 255;
  SDL_PixelFormat *format = screen->format;
  Uint32 pixelBranco = SDL_MapRGB(format, branco.r, branco.g, branco.b);
  
  SDL_FillRect(screen, NULL, pixelBranco);
  
  img = SDL_LoadBMP("/usr/Drawing/resources/fundo.bmp");
  SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0));
  SDL_BlitSurface(img,NULL, screen, NULL);
  
  desenhaTexto(screen, "Sobre", font_pause, 430, 100);
  desenhaTexto(screen, "Este jogo foi desenvolvido na disciplina de Introdução à Jogos", font_custo, 200, 200);
  desenhaTexto(screen, "Eletrônicos do segundo semestre de 2012! Aproveite o jogo e ", font_custo, 200, 230);
  desenhaTexto(screen, "boa diversão! ", font_custo, 200, 260);
  desenhaTexto(screen, "Voltar", font_pause, 420, 500);
  SDL_Flip(screen);
  SDL_FreeSurface(img);
  
  while (SDL_PollEvent(&event)) {
    switch (event.type) {
      case SDL_QUIT:
	quit = true;
	break;
      case SDL_KEYDOWN:
	switch (event.key.keysym.sym) {
	  case SDLK_ESCAPE:
	    quit = true;
	    break;
	  default:
	    break;
	}break; 
	  case SDL_MOUSEBUTTONUP:
	    switch (event.button.button) {
	      case SDL_MOUSEMOTION:
		if (((event.button.x > 420)&&(event.button.x<550))&&
		  ((event.button.y>500)&&(event.button.y<550))){
		  desenhaTextoSombra(screen, "Voltar", font_pause, 420, 500);
		SDL_Flip(screen);
		  }
		  break;
	      case SDL_BUTTON_LEFT:
		if (((event.button.x > 420)&&(event.button.x<550))&&
		  ((event.button.y>500)&&(event.button.y<550))){
		  sair = 1;
		  }
		  break;
		
	    }
    }
  }
  
}


void atualizaUnidades(){
  SDL_Event event;
  Inimigo inimigo_l = inimigoEsquerda;
  Torre torre_l = torreEsquerda;
  Audio audio;
  inimigo_l.tinta = 1;
  torre_l.custo = 7;
  if(fim_de_jogo){
    inimigos.clear();
    torres.clear();
    passo.clear();
    jogador.tinta = jogador.tinta_inicio;
    m.resetMalha();
    while (SDL_PollEvent(&event)) {
      switch (event.type) {
	case SDL_QUIT:
	  quit = true;
	  break;
	case SDL_KEYDOWN:
	  switch (event.key.keysym.sym) {
	    case SDLK_ESCAPE:
	      quit = true;
	      break;
	    case SDLK_r:
	      castelo.pontos_de_vida = castelo.pt_vida_total;
	      wave.inimigos = wave.inimigos_total;
	      wave.controle = wave.intervalo;
	      fim_de_jogo = false;
	      break;
	    default:
	      //Sem tratamento
	      break;
	  }
	    default:
	      //Sem tratamento
	      break;
      }
    }
  }
  else{
    if (pausado){
      while (SDL_PollEvent(&event)) {
	switch (event.type) {
	  case SDL_QUIT:
	    quit = true;
	    break;
	  case SDL_KEYDOWN:
	    switch (event.key.keysym.sym) {
	      case SDLK_ESCAPE:
		quit = true;
		break;
	      case SDLK_p:
		pausado = false;
		break;
	      default:
		//Sem tratamento
		break;
	    }
	      default:
		//Sem tratamento
		break;
	}
      }
    }
    else{
      while (SDL_PollEvent(&event)) {
	switch (event.type) {
	  case SDL_QUIT:
	    quit = true;
	    break;
	  case SDL_KEYDOWN:
	    switch (event.key.keysym.sym) {
	      case SDLK_ESCAPE:
		quit = true;
		break;
		// 	      case SDLK_i:
		// 		inimigos.push_back(inimigo_l);
		// 		passo.push_back(0);
		// 		break;
	      case SDLK_p:
		pausado = true;
		break;
	      default:
		break;
	    }
	    break;
	      case SDL_MOUSEMOTION:
		if(habilitaTorre){
		  if(selecTorre == 7){
		    rect.x = event.button.x - 15;
		    rect.y = event.button.y - 45;
		  }else{
		    rect.x = event.button.x - 60;
		    rect.y = event.button.y - 65;
		  }
		}
		break;
	      case SDL_MOUSEBUTTONUP:
		switch (event.button.button) {
		  case SDL_BUTTON_LEFT:
		    if(((event.button.x > 890)&&(event.button.x < 970))&&
		      ((event.button.y>85)&&(event.button.y<630))){
			if((event.button.y>75)&&(event.button.y<150)&&(jogador.tinta >= torre_l.custo)){
			  torre_l = torreEsquerda;
			  selecTorre = 1;
			  alfaMalha = 42;
			  mostraMalha = -mostraMalha;
			  habilitaTorre = true;
			  
			}
// 		      if((event.button.y>175)&&(event.button.y<250)&&(jogador.tinta >= torre_l.custo)){
// 			torre_l = torreDireita;
// 			selecTorre=2;
// 			alfaMalha = 42;
// 			mostraMalha = -mostraMalha;
// 			habilitaTorre = true;
// 		      }
			  if((event.button.y > 560)&&(event.button.y < 625)&&(torres.size() > 0)){
			    selecTorre = 7;
			    alfaMalha = 42;
			    mostraMalha = -mostraMalha;
			    habilitaTorre = true;
			  }
		      }else{
			if(habilitaTorre){
			  habilitaTorre = false;
			  mostraMalha = -mostraMalha;
			  alfaMalha = 42;
			  switch(selecTorre){
			    case 1:
			      torre_l.casa = m.Ecasa(event.button.x,event.button.y);
			      if((torre_l.casa.x != 0 || torre_l.casa.y != 0)&&(jogador.tinta >= torre_l.custo)){
				torre_l.velocidade_ataque = 10;
				torre_l.dano = 3;
				torre_l.preencheLinhaAtaque(m.caminho);
				torres.push_back(torre_l);
				jogador.tinta -= torre_l.custo;
			      }break;
			    case 7:
			      Casa casa_l;
			      casa_l = m.Etorre(event.button.x,event.button.y);
			      if(torre_l.casa.x != 0 || torre_l.casa.y != 0){
				for(unsigned int i = 0; i < torres.size(); i++){
				  if(torres[i].casa.x == casa_l.x && torres[i].casa.y == casa_l.y){
				    recurso.casa = torres[i].casa;
				    recurso.casa.x -= 35;
				    recurso.alfa = 180;
				    recursos.push_back(recurso);
				    jogador.tinta += (torres[i].custo)/2;
				    torres.erase(torres.begin()+i);
				  }
				}
			      }break;
			  }
			  selecTorre = 0;
			}
		      }
		      break;
		      }break;
		}
	}
	if(wave.controle >= 0 && wave.inimigos > 0)
	  if(wave.mandaInimigos()){
	    inimigos.push_back(inimigo_l);
	    passo.push_back(0); 
	  }
	  atualizaTorres(torres);
	atualizaInimigos(inimigos);
      }
    }
  }
  
  void desenhaTela(SDL_Surface *screen){
    char* texto = NULL;
    stringstream strs;
    strs << "x "<< castelo.pontos_de_vida;
    string temp_str = strs.str();
    texto = (char*) temp_str.c_str();
    desenhaOutros(screen);
    //   desenhaUnidades(screen);
    desenhaTorres(screen);
    desenhaInimigos(screen);      
    desenhaTexto(screen, texto, font_vida_castelo, 9 * (*screen).w/10, 10);
    desenhaVidaInimigos(screen);
    if(mostraMalha < 0){
      desenhaMalha(screen);
      desenhaCompra(screen);
    }
    if(pausado){
      desenhaTexto(screen, "Jogo Pausado", font_pause, 10, 10);
    }
    if(castelo.pontos_de_vida <= 0){
      fim_de_jogo = true;
      desenhaTexto(screen, "Você Perdeu!", font_fim_jogo, (*screen).w/10 , (*screen).h/3);
      desenhaTexto(screen,  "Pressione \"R\" para tentar novamente", font_vida_castelo, (*screen).w/10, (*screen).h/3 + 200);
    }
    if(wave.inimigos <= 0 && castelo.pontos_de_vida > 0 && inimigos.size() == 0){
      fim_de_jogo = true;
      desenhaTexto(screen, "Parabéns!!!", font_fim_jogo, (*screen).w/10 , (*screen).h/5);
      desenhaTexto(screen, "Você venceu!!", font_fim_jogo, (*screen).w/10 , (*screen).h/5+150);
      desenhaTexto(screen,  "Pressione \"R\" para reiniciar!", font_vida_castelo, (*screen).w/10, (*screen).h/3 + 250);
    }
    SDL_Flip(screen);
  }
  
  void carregaRecursos(){
    mapa = Unidade("/usr/Drawing/resources/mapa1.bmp");
    borracha = Unidade("/usr/Drawing/resources/borracha.bmp");
    drawing = Unidade("/usr/Drawing/resources/drawing.bmp");
    fundo = Unidade("/usr/Drawing/resources/fundo.bmp");
    inimigoDireita = Inimigo("/usr/Drawing/resources/inimigo_direita.bmp", 20);
    inimigoDireita1 = Unidade("/usr/Drawing/resources/inimigo_direita_1.bmp");
    inimigoDireita2 = Unidade("/usr/Drawing/resources/inimigo_direita_2.bmp");
    inimigoDireita3 = Unidade("/usr/Drawing/resources/inimigo_direita_3.bmp");
    inimigoEsquerda = Inimigo("/usr/Drawing/resources/inimigo_esquerda.bmp", 20);
    inimigoEsquerda1 = Unidade("/usr/Drawing/resources/inimigo_esquerda_1.bmp");
    inimigoEsquerda2 = Unidade("/usr/Drawing/resources/inimigo_esquerda_2.bmp");
    inimigoEsquerda3 = Unidade("/usr/Drawing/resources/inimigo_esquerda_3.bmp");
    menu = Unidade("/usr/Drawing/resources/menu.bmp");
    selecao = Unidade("/usr/Drawing/resources/selecao.bmp");
    torreEsquerda = Torre("/usr/Drawing/resources/torre_esquerda.bmp");
    torreDireita = Torre("/usr/Drawing/resources/torre_direita.bmp");
    torreEsquerdaAttack = Torre("/usr/Drawing/resources/torre_esquerda_attack.bmp");
    torreDireitaAttack = Torre("/usr/Drawing/resources/torre_direita_attack.bmp");
    arqueiro = Torre("/usr/Drawing/resources/arqueiro_esquerda.bmp");
    lapis = Unidade("/usr/Drawing/resources/lapis.bmp");
    castelo = Inimigo("/usr/Drawing/resources/castelo.bmp", 20);
    malha = Unidade("/usr/Drawing/resources/malha.bmp");
    tinta = Unidade("/usr/Drawing/resources/tinta.bmp");
    recurso = Recurso("/usr/Drawing/resources/tinta30x30.bmp");
    inimigo = Unidade("/usr/Drawing/resources/inimigo55x55.bmp");
    font_pause = TTF_OpenFont("/usr/Drawing/resources/KGFeeling22.ttf", 50);
    font_vida_castelo = TTF_OpenFont("/usr/Drawing/resources/KGFeeling22.ttf", 50);
    font_fim_jogo = TTF_OpenFont("/usr/Drawing/resources/KGFeeling22.ttf", 120);
    font_custo = TTF_OpenFont("/usr/Drawing/resources/KGFeeling22.ttf", 25);
    wave = Wave(80, 40);
    jogador = Jogador();
    preencheCaminho();
    lapis.casa = m.casas[9][2];
    castelo.casa = m.casas[10][4];
    inimigoEsquerda.casa = m.casas[0][0];
  }
  void desenhaReta(vector<Casa> &guiaInimigo, int x, int y, int xl, int yl){
    //Variaveis temporarias
    vector<Casa> guiaTemp;//vetor temporario
    vector<Casa> alo;
    Casa cordenadas;//variavel para armazenar as cordenadas
    int sinal;//sinal da função, define se funcao será crescente ou decrescente
    int inverte;// define se é preciso inverter o vetor da reta gerado
    int xinicial, xfinal, yinicial, yfinal;
    if((x<xl && y>yl )||(x<xl && y<yl)){
      inverte = 0;
      xinicial = x;
      xfinal = xl;
      yinicial = y;
      yfinal = yl;
    }
    else{ 
      inverte = 1;
      xinicial = xl;
      xfinal = x;
      yinicial = yl;
      yfinal = y;
    }
    
    
    if(xfinal>xinicial && yfinal>yinicial)
      sinal = 1;
    else
      sinal = 0;
    for (int i = 0 ; i<(xfinal-xinicial); i++){
      cordenadas.x = i+xinicial;
      cordenadas.y = funcaoReta(i,sinal) + yinicial;
      
      if(inverte == 1){
	
	alo.push_back(cordenadas);
      }
      else{
	guiaInimigo.push_back(cordenadas);
      }
    }
    if(inverte ==1){
      for(unsigned int i =1; i<=alo.size(); i++){
	
	guiaInimigo.push_back(alo[alo.size()-i]);
      }
    }
  }
  
  int funcaoReta(int x, int sinal){
    if(sinal ==1)
      return 0.625*x;
    else
      return -0.625*x;
  }
  
  void preencheCaminho(){
    desenhaReta(m.caminho, 160,250,400,100);
    desenhaReta(m.caminho, 400,100,680,275);
    desenhaReta(m.caminho, 680,275,520,375);
    desenhaReta(m.caminho, 520,375,360,275);
  }
  
  void desenhaVidaInimigos(SDL_Surface *screen){
    unsigned int i = 0;
    SDL_Rect casa;
    SDL_Color verde;
    verde.g = 255;
    verde.r = verde.b = 0;
    SDL_PixelFormat *format = screen->format;
    Uint32 pixelVerde = SDL_MapRGB(format, verde.r, verde.g, verde.b);
    
    SDL_Color vermelho;
    vermelho.r = 255;
    vermelho.g = vermelho.b = 0;
    Uint32 pixelVermelho = SDL_MapRGB(format, vermelho.r, vermelho.g, vermelho.b);
    while(i < inimigos.size()){
      casa.x = inimigos[i].casa.x + 30;
      casa.y = inimigos[i].casa.y - 10;
      casa.w = (50 * (inimigos[i].pt_vida_total - inimigos[i].pontos_de_vida))/inimigos[i].pt_vida_total;
      casa.h = 5;
      SDL_FillRect(screen, &casa, pixelVermelho);
      casa.x = inimigos[i].casa.x + 30 + casa.w;
      casa.y = inimigos[i].casa.y - 10;
      casa.w = 50 - (50 * (inimigos[i].pt_vida_total - inimigos[i].pontos_de_vida))/inimigos[i].pt_vida_total;
      casa.h = 5;
      SDL_FillRect(screen, &casa, pixelVerde);
      i++;
    }
  }
      
      void desenhaTorres(SDL_Surface *screen){
	unsigned int i = 0;
	SDL_Rect casa;
	while(i < torres.size()){
	  casa.x = torres[i].casa.x - m.w;
	  casa.y = torres[i].casa.y;
	  SDL_BlitSurface(torres[i].img,NULL, screen, &casa);
	  i++;
	}
      }
      
      void desenhaInimigos(SDL_Surface *screen){
	unsigned int i = 0;
	SDL_Rect casa;
	while(i < inimigos.size()){
	  casa.x = inimigos[i].casa.x;
	  casa.y = inimigos[i].casa.y;
	  SDL_BlitSurface(inimigos[i].img,NULL, screen, &casa);
	  i++;
	}
      }
      
      void atualizaInimigos(vector<Inimigo> &inimigos){
	Audio audio;
	unsigned int i = 0;
	while(i < inimigos.size()){
	  if(inimigos[i].casa.x >= m.caminho[passo[i]].x){
	    if(passo[i]%12 < 3){
	      inimigos[i].img = inimigoEsquerda.img;
	    }else{
	      if(passo[i]%12 < 6){
		inimigos[i].img = inimigoEsquerda1.img;
	      }else{
		if(passo[i]%12 < 9){
		  inimigos[i].img = inimigoEsquerda2.img;
		}else{
		  inimigos[i].img = inimigoEsquerda3.img;
		}
	      }
	    }
	  }else{
	    if(passo[i]%12 < 3){
	      inimigos[i].img = inimigoDireita.img;
	    }else{
	      if(passo[i]%12 < 6){
		inimigos[i].img = inimigoDireita1.img;
	      }else{
		if(passo[i]%12 < 9){
		  inimigos[i].img = inimigoDireita2.img;
		}else{
		  inimigos[i].img = inimigoDireita3.img;
		}
	      }
	    }
	  }
	  inimigos[i].casa = m.caminho[passo[i]];
	  i++;
	}
	for(i = 0; i < inimigos.size(); i++){
	  if(inimigos[i].pontos_de_vida <= 0){
	    jogador.tinta += inimigos[i].tinta;
	    recurso.casa = inimigos[i].casa;
	    recurso.alfa = 180;
	    recursos.push_back(recurso);
	    inimigos.erase(inimigos.begin() + i);
	    passo.erase(passo.begin() + i);
	  }
	}
	for(i = 0; i < passo.size(); i++){
	  if(passo[i] == m.caminho.size()-1){
	    inimigos.erase(inimigos.begin() + i);
	    passo.erase(passo.begin() + i);
	    castelo.pontos_de_vida--;
	  }
	  else{
	    passo[i] = passo[i]+1;
	  }
	}
      }
      
      void desenhaMalha(SDL_Surface *screen){
	SDL_Surface * src;
	SDL_SetAlpha(malha.img, SDL_SRCALPHA|SDL_RLEACCEL, alfaMalha);
	src =  SDL_DisplayFormatAlpha(malha.img);
	SDL_BlitSurface(src,NULL, screen, NULL);
	if(alfaMalha == 40 || alfaMalha == 80){
	  sinalMalha *= -1;
	}
	alfaMalha += sinalMalha;
	if(selecTorre==1){
	  SDL_SetAlpha(selecao.img, SDL_SRCALPHA|SDL_RLEACCEL, alfaMalha);
	  src =  SDL_DisplayFormatAlpha(selecao.img);
	  SDL_Rect casa;
	  casa.x = 885; casa.y = 80;
	  SDL_BlitSurface(src,NULL, screen, &casa);
	}
	if(selecTorre==2){
	  SDL_SetAlpha(selecao.img, SDL_SRCALPHA|SDL_RLEACCEL, alfaMalha);
	  src =  SDL_DisplayFormatAlpha(selecao.img);
	  SDL_Rect casa;
	  casa.x = 885; casa.y = 185;
	  SDL_BlitSurface(src,NULL, screen, &casa);
	}
	SDL_FreeSurface(src);
      }
      
      void desenhaOutros(SDL_Surface *screen){
	SDL_Rect casa;
	SDL_Surface *src = NULL;
	unsigned int i;
	char *texto = NULL, *texto1 = NULL;
	stringstream strs, strs1;
	strs << "x " << jogador.tinta;
	string temp_str = strs.str(), temp_str1;
	texto = (char*) temp_str.c_str();
	casa.x = lapis.casa.x - 130;
	casa.y = lapis.casa.y - 20;
	SDL_BlitSurface(lapis.img,NULL, screen, &casa);
	casa.x = castelo.casa.x - 10;
	casa.y = castelo.casa.y + 10;
	SDL_BlitSurface(castelo.img,NULL, screen, &casa);
	casa.x = 860;
	casa.y = 60;
	SDL_BlitSurface(menu.img, NULL, screen, &casa);
	casa.x = 880;
	casa.y = 85;
	SDL_BlitSurface(torreEsquerda.img, NULL, screen, &casa);
	desenhaTexto(screen, "7", font_custo, casa.x+80, casa.y+50);
	casa.x = 880;
	casa.y = 185;
	SDL_BlitSurface(arqueiro.img,NULL,screen,&casa);
	desenhaTexto(screen, "5", font_custo, casa.x+80, casa.y+40);
	casa.x = 900;
	casa.y = 560;
	SDL_BlitSurface(borracha.img,NULL,screen,&casa);
	desenhaTexto(screen, "-", font_custo, casa.x+60, casa.y+40);
	casa.x = 10;
	casa.y = 9* (*screen).h/10;
	SDL_BlitSurface(tinta.img,NULL,screen,&casa);
	casa.x = 9 * (*screen).w/10 - 55;
	casa.y = 15;
	SDL_BlitSurface(inimigo.img,NULL,screen,&casa);
	desenhaTexto(screen, texto, font_vida_castelo, 100, 9* (*screen).h/10);
	strs1 << "Wave: " << wave.inimigos <<" de "<< wave.inimigos_total;
	temp_str1 = strs1.str();
	texto1 = (char*) temp_str1.c_str();
	desenhaTexto(screen, texto1, font_vida_castelo, 2*(*screen).w/3, 9* (*screen).h/10);
	if(recursos.size() > 0){
	  for(i = 0; i < recursos.size(); i++){
	    if(recursos[i].alfa >= 0){
	      SDL_SetAlpha(recursos[i].img, SDL_SRCALPHA|SDL_RLEACCEL, recursos[i].alfa);
	      src =  SDL_DisplayFormatAlpha(recursos[i].img);
	      casa.x = recursos[i].casa.x+40;
	      casa.y = recursos[i].casa.y+40;
	      SDL_BlitSurface(src,NULL,screen,&casa);
	      recursos[i].alfa -= 10;
	      recursos[i].casa.y -= 2;
	    }else{
	      recursos.erase(recursos.begin() + i);
	    }
	  }
	}
	SDL_FreeSurface(src);
      }
      
      void liberaRecursos(){
	TTF_Quit();
      }
      
      void desenhaTexto(SDL_Surface *screen, const char *text, TTF_Font *font, int x, int y)
      {
	SDL_Color preto;
	preto.r = preto.g = preto.b = 0;
	SDL_Surface *renderedText = NULL;
	SDL_Rect dest;
	
	renderedText = TTF_RenderUTF8_Blended(font, text, preto);
	
	dest.x = x;
	dest.y = y;
	
	SDL_BlitSurface(renderedText, NULL, screen, &dest);	
	SDL_FreeSurface(renderedText);
      }
      
      void desenhaTextoSombra(SDL_Surface *screen, const char *text, TTF_Font *font, int x, int y)
      {
	SDL_Color preto;
	preto.r = preto.g = preto.b = 0;
	
	SDL_Surface *renderedText = NULL;
	SDL_Rect dest;
	
	TTF_SetFontStyle(font, TTF_STYLE_UNDERLINE);
	renderedText = TTF_RenderUTF8_Blended(font, text, preto);
	TTF_SetFontStyle(font, TTF_STYLE_NORMAL);
	
	dest.x = x;
	dest.y = y;
	
	SDL_BlitSurface(renderedText, NULL, screen, &dest);	
	SDL_FreeSurface(renderedText);
      }
      
      void atualizaTorres(vector<Torre> &torres_a){
	unsigned int i = 0, j = 0;
	int indice = -1, temp = -1, indice_inimigo = 0;
	bool alcance = false;
	if(torres_a.size() > 0){
	  for(i = 0; i < torres_a.size();i++){
	    if(inimigos.size() > 0){
	      for(j = 0; j < inimigos.size(); j++){
		for(unsigned int l = 0; l < torres_a[i].linha_ataque.size(); l++){
		  if((inimigos[j].casa.x == torres_a[i].linha_ataque[l].x) && 
		    (inimigos[j].casa.y == torres_a[i].linha_ataque[l].y) && 
		    (inimigos[j].pontos_de_vida > 0)){
		    for(unsigned int k = 0; k < m.caminho.size(); k++){
		      if(inimigos[j].casa.x == m.caminho[k].x && inimigos[j].casa.x == m.caminho[k].x){
			indice = k;
			alcance = true;
		      }
		    } 
		    }
		}
		if(indice > temp && indice != -1){
		  temp = indice;
		  indice_inimigo = j;
		}
	      }
	    }
	      if(inimigos[indice_inimigo].casa.x <= (torres_a[i].casa.x-40)){
		torres_a[i].img  =  torreEsquerda.img;
		torreAttackTemp  = torreEsquerdaAttack;
	      }else{
		torres_a[i].img  =  torreDireita.img;
		torreAttackTemp = torreDireitaAttack;
	      }
	    if(alcance){
		torres_a[i].Ataca(&inimigos[indice_inimigo], torreAttackTemp);
	        alcance = false;
	    }
	  }
	}
      }
      
      void limpaTela(SDL_Surface *screen){
	SDL_Color branco;
	branco.r = branco.g = branco.b = 255;
	SDL_PixelFormat *format = screen->format;
	Uint32 pixelBranco = SDL_MapRGB(format, branco.r, branco.g, branco.b);
	SDL_FillRect(screen, NULL, pixelBranco);
	SDL_BlitSurface(fundo.img,NULL, screen,NULL);
	SDL_BlitSurface(mapa.img,NULL, screen,NULL);
      }
      
      void desenhaCompra(SDL_Surface *screen){
	SDL_Rect alcance;
	SDL_Color azul;
	azul.b = 255;
	azul.r = azul.g = 150;
	SDL_PixelFormat *format = screen->format;
	Uint32 pixelAzul = SDL_MapRGB(format, azul.r, azul.g, azul.b);
	switch(selecTorre){
	  case 1:
	    alcance.w = m.w;
	    alcance.h = m.h;
	    alcance.x = rect.x;
	    alcance.y = rect.y + m.h;
	    SDL_FillRect(screen, &alcance, pixelAzul);
	    SDL_BlitSurface(torreEsquerda.img, NULL, screen, &rect);
	    alcance.y = rect.y + 3*m.h;
	    SDL_FillRect(screen, &alcance, pixelAzul);
	    alcance.x = rect.x + 2 *m.w;
	    alcance.y = rect.y + 3 *m.h;
	    SDL_FillRect(screen, &alcance, pixelAzul);
	    alcance.x = rect.x + 2 *m.w;
	    alcance.y = rect.y + m.h;
	    SDL_FillRect(screen, &alcance, pixelAzul);
	    break;
	  case 2:
	    break;
	  case 7:
	    SDL_BlitSurface(borracha.img, NULL, screen, &rect);
	    break;
	  default:
	    break;
	}
      }